const db = require('../db')
const bcryptjs = require('bcryptjs')
const schema = require('../schema')
const {validationUtil, procWhere, procOrder} = require('./util')
const auth = require('../auth')
const captcha = require('../util/captcha')
const {redisCli} = require('../redis')

// 注册新用户
exports.regUser = (req, res) => {
    let userinfo = req.body
    // 1.检测表单数据是否合法；
    validationUtil(schema.userSchema.regUser, userinfo) // 验证失败抛异常，被全局错误处理器处理 
    
    // 2.检测用户名是否被占用；
    db.User.findAll({
        where: {
            username: userinfo.username
        }
    }).then(results => {
        console.log('results', results)
        // 用户名被占用 
        if(results.length > 0) {
            return res.cc('用户名被占用，请更换其他用户名！')
        }
        // 3.对密码进行加密处理；
        // console.log(userinfo)
        userinfo.password = bcryptjs.hashSync(userinfo.password, 10) // hashSync(明文，随机盐长度)
        // console.log(userinfo)
        // 4.插入新用户。
        db.User.create({
            username: userinfo.username, 
            password: userinfo.password
        }).then(result => {
            console.log('insert result', JSON.stringify(result)) 
            // 判断影响行数是否为1
            if(!result || !result.username) return res.cc('用户注册失败，请稍后再试！')
            // 注册成功 
            res.cc('注册成功！', 0)
        }).catch(err => {
            res.cc(err)
        })
    }).catch(err => {
        res.cc(err)
    })
    
}

// 登录 
exports.login = (req, res) => {
    let userinfo = req.body
    // 1.检测表单数据是否合法；
    validationUtil(schema.userSchema.login, userinfo) // 验证失败抛异常，被全局错误处理器处理 

    // 验证码校验 
    redisCli.get(`code-${userinfo.tm}`, (err, val) => {
        console.log('code', val)
        if(!val) {
            return res.cc('验证码失效')
        } 
        if(val !== userinfo.code) {
            return res.cc('验证码错误')
        } 
        // 2.检测用户名是否存在；
        db.User.findAll({
            where: {
                username: userinfo.username
            }
        }).then(results => {
            console.log('results', results)
            // 用户名无 
            if(results.length === 0) {
                return res.cc('用户不存在！')
            }
            // 3.验证密码；
            // console.log(userinfo)
            let correct = bcryptjs.compareSync(userinfo.password, results[0].password)
            if(correct) {
                return res.send({
                    status: 0,
                    message: '登录成功',
                    token: 'Bearer ' + auth.jwt.sign({username: userinfo.username, id: results[0].id}, auth.secretKey, {expiresIn: '10h'})
                })
            } else {
                res.cc('密码错误')
            }
        }).catch(err => {
            res.cc(err)
        })
    })
}

// 验证码 
exports.captcha = (req, res) => {
    console.log('captcha...', req.query)
    let cap = captcha()
    // console.log(JSON.stringify(cap))
    //req.session.captchaCode = cap.text.toLowerCase() 使用jwt就不能使用session了 
    redisCli.get('author', (err, val) => {
        console.log('val', val)
    })
    redisCli.set(`code-${req.query.tm}`, cap.text.toLowerCase(), 'EX', 60, (err, obj) => {
        console.log('redis set obj', err, obj)
    })
    res.setHeader('Content-Type', 'image/svg+xml')
    res.send(cap.data)
    res.end()
}

// 查询用户
exports.list = (req, res) => {
    let params = req.body
    // 1.检测表单数据是否合法；
    validationUtil(schema.userSchema.userList, params) // 验证失败抛异常，被全局错误处理器处理 
    
    // 2.查询 
    let offset = (params.currentPage-1)*params.pageSize 
    let limit = params.pageSize 
    let where = procWhere(params.where, db.UserAttributes) 
    let order = procOrder(params.sort)
    let options = {
            offset,
            limit,
            where,
        }
    if(order) options.order = order 
    db.User.findAll(options).then(results => {
        // console.log('results: ', results)
        // 查询total 
        db.User.findAll({
            attributes: [
                [db.Sequelize.fn('COUNT', db.Sequelize.col('*')), 'cnt']
            ],
            where
        }).then(results2 => {
            let total = JSON.parse(JSON.stringify(results2))[0].cnt  
            res.json({
                status: 0,
                message: 'success',
                data: {results, total}
            })
        }).catch(err => {
            res.cc(err)
        })
    }).catch(err => {
        res.cc(err)
    })
}

// 员工用户  
exports.delete = (req, res) => {
    let params = req.body
    console.log('params', params)
    // 1.检测表单数据是否合法；
    validationUtil(schema.userSchema.userDelete, params) // 验证失败抛异常，被全局错误处理器处理 
    if(!params.ids.length) return res.cc('参数ids为空,无需删除', 0)
    
    // 2.查询 
    db.User.destroy({
        where: {
            id: params.ids
        }
    }).then(results => {
        console.log('results', results)
        res.json({
            status: 0,
            message: 'success',
            data: results
        })
    }).catch(err => {
        res.cc(err)
    })
    
}

